package com.vast.admin.service.impl;

import cn.hutool.core.date.DateTime;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.vast.common.utils.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.vast.admin.entity.Banner;
import com.vast.common.core.domain.entity.SysUser;
import com.vast.admin.entity.enums.OperatorEum;
import com.vast.admin.entity.enums.QueryOrderEnum;
import com.vast.admin.mapper.BannerMapper;
import com.vast.admin.service.BannerService;
import com.vast.admin.utils.QueryBuilder;
import com.vast.admin.utils.TableFieldColumnsUtils;
import org.springframework.stereotype.Service;

import java.util.*;


@Service
public class BannerServiceImpl extends  ServiceImpl<BannerMapper, Banner> implements BannerService {


    @Override
    public IPage<Banner> getBannerList(Page<Banner> page, Integer type) {
        QueryWrapper<Banner> queryWrapper = new QueryWrapper<>();
        if (type != null) {
            queryWrapper.eq(Banner.COL_TYPE, type);
            queryWrapper.orderByDesc(Banner.COL_CREATE_TIME);
            queryWrapper.orderByAsc(Banner.COL_SORT);
        }
        IPage<Banner> data = baseMapper.selectPage(page, queryWrapper);
        return data;
    }

    @Override
    public int addBanner(SysUser user, Banner banner) {
        banner.setCreateTime(DateTime.now());
        banner.setUpdateTime(DateTime.now());
        banner.setCreateBy(user.getUserId());
        banner.setUpdateBy(user.getUserId());
        banner.setValid(1);
        return baseMapper.insert(banner);
    }

    @Override
    public IPage<Banner> queryList(Page<Banner> page, boolean listMode, String queryItems, String orderField, QueryOrderEnum order) {
        QueryWrapper<Banner> queryWrapper = new QueryWrapper<>();
        Map<String, String> fieldColumns = TableFieldColumnsUtils.getInstance().getFieldTableColumns(Banner.class);
        if (listMode) {
            // size 小于 0 不在查询 total 及分页，自动调整为列表模式。
            // 注意！！这个地方自己控制好！！
            page.setSize(-1);
        }
        if (!StringUtils.isEmpty(queryItems)) {
            List<QueryBuilder> queryBuilders = new ArrayList<>();
            String[] queryItemArr = queryItems.split(";");
            if(queryItemArr.length > 0){
                for (String queryItemStr : queryItemArr) {
                    String[] itemArr = queryItemStr.split(",");
                    if(itemArr.length == 3){
                        String as = itemArr[1];
                        String params = itemArr[2];
                        if(!StringUtils.isEmpty(params)){
                            queryBuilders.add(new QueryBuilder(itemArr[0], OperatorEum.valueOf(as),itemArr[2]));
                        }
                    }
                }
            }

            for (QueryBuilder queryBuilder : queryBuilders) {
                //查询字段
                String field = queryBuilder.getField();
                //查询参数值
                String params = queryBuilder.getParams();
                if (fieldColumns.containsKey(field) && !StringUtils.isEmpty(params)) {
                    //表属性
                    String tableColumn = fieldColumns.get(field);
                    if (queryBuilder.getAs() == OperatorEum.EQ) {
                        queryWrapper.eq(tableColumn, params);
                    }else if(queryBuilder.getAs() == OperatorEum.LIKE){
                        queryWrapper.like(tableColumn, params);
                    }else if(queryBuilder.getAs() == OperatorEum.LIKELEFT){
                        queryWrapper.likeLeft(tableColumn, params);
                    }else if(queryBuilder.getAs() == OperatorEum.LIKERIGHT){
                        queryWrapper.likeRight(tableColumn, params);
                    }else if(queryBuilder.getAs() == OperatorEum.GE){
                        queryWrapper.ge(tableColumn, params);
                    }else if(queryBuilder.getAs() == OperatorEum.LE){
                        queryWrapper.le(tableColumn, params);
                    }
                }
            }
        }
        if (!StringUtils.isEmpty(orderField)) {
            String[] orderByColumns = orderField.split(",");
            String queryOrderByColumns = "";
            if (orderByColumns.length > 0) {
                StringBuilder sb = new StringBuilder();
                for (String orderByColumn : orderByColumns) {
                    if (fieldColumns.containsKey(orderByColumn)) {
                        sb.append(fieldColumns.get(orderByColumn)).append(",");
                    }
                }
                if (sb.length() > 0) {
                    queryOrderByColumns = sb.deleteCharAt(sb.length() - 1).toString();
                }
            }
            if (!StringUtils.isEmpty(queryOrderByColumns)) {
                if(order == null){
                    order = QueryOrderEnum.ASC;
                }
                if (order == QueryOrderEnum.ASC) {
                    queryWrapper.orderByAsc(queryOrderByColumns);
                } else if (order == QueryOrderEnum.DESC) {
                    queryWrapper.orderByDesc(queryOrderByColumns);
                }
            }

        }
        return baseMapper.selectPage(page, queryWrapper);
    }

    @Override
    public boolean delete(SysUser manager, Long[] ids) {
        List<Long> idsList = Arrays.asList(ids);
        int count = baseMapper.deleteBatchIds(idsList);

        return count == ids.length;
    }

    @Override
    public Banner info(SysUser manager, Long id) {
        return  baseMapper.selectById(id);
    }

    @Override
    public boolean addOrUpdate(SysUser manager, Banner bean) {
        if (bean.getId() == null) {
            bean.setCreateBy(manager.getUserId());
            bean.setUpdateBy(manager.getUserId());
            bean.setCreateTime(DateTime.now());
            bean.setUpdateTime(DateTime.now());
            bean.setValid(1);

            baseMapper.insert(bean);

            return true;
        } else {
            bean.setUpdateBy(manager.getUserId());
            bean.setUpdateTime(DateTime.now());
            bean.setValid(1);
            baseMapper.updateById(bean);
            return true;

        }
    }

}


